home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2006 May / PCWMAY06.iso / Software / Trial / ConceptDraw NetDiagrammer / data1.cab / Samples__Basic / Solutions / OrgChart / loadXMLFunctions.cdb < prev    next >
Text File  |  2006-02-08  |  17KB  |  380 lines

  1. '╨ñ╤â╨╜╨║╤å╨╕╤Å BuildOrgTreeFromXML ╨╖╨░╤ç╨╕╤é╤ï╨▓╨░╨╡╤é ╨┤╨░╨╜╨╜╤ï╨╡ ╨╛ ╤ü╤é╤Ç╤â╨║╤é╤â╤Ç╨╡ ╨╛╤Ç╨│╨░╨╜╨╕╨╖╨░╤å╨╕╨╕ ╨╕╨╖ XML-╤ä╨░╨╣╨╗╨░
  2. '╨╕ ╨╖╨░╨┐╨╛╨╗╨╜╤Å╨╡╤é ╨╝╨░╤ü╤ü╨╕╨▓╤ï, ╨▓ ╨║╨╛╤é╨╛╤Ç╤ï╤à ╤à╤Ç╨░╨╜╤Å╤é╤ü╤Å ╨┤╨░╨╜╨╜╤ï╨╡ ╨╛ ╤ü╨╛╤é╤Ç╤â╨┤╨╜╨╕╨║╨╡ ╨╕ ╨╡╨│╨╛ ╨┐╨╛╨╗╨╛╨╢╨╡╨╜╨╕╨╕ ╨▓ ╤ü╤é╤Ç╤â╨║╤é╤â╤Ç╨╡. 
  3. Function BuildOrgTreeFromXML(ByRef strXMLFileName As String) As Boolean
  4. On Error GoTo ErrHandle
  5. Dim intFileNumber As Integer        '╨ÿ╨┤╨╡╨╜╤é╨╕╤ä╨╕╨║╨░╤é╨╛╤Ç ╨╛╨▒╤Ç╨░╨▒╨░╤é╤ï╨▓╨░╨╡╨╝╨╛╨│╨╛ XML-╤ä╨░╨╣╨╗╨░
  6. Dim intRetTagValue As Integer        '╨ƒ╨╛╤ü╨╗╨╡╨┤╨╜╨╡╨╡ ╨╖╨╜╨░╤ç╨╡╨╜╨╕╨╡, ╨║╨╛╤é╨╛╤Ç╨╛╨╡ ╨▓╨╛╨╖╨▓╤Ç╨░╤ë╨░╨╡╤é ╤ä╤â╨╜╨║╤å╨╕╤Å, ╨╕╨╖╨▓╨╗╨╡╨║╨░╤Ä╤ë╨░╤Å ╤ü╨╗╨╡╨┤╤â╤Ä╤ë╨╕╨╣ ╤é╤ì╨│╨░. ╨í╨╛╨┤╨╡╤Ç╨╢╨╕╤é ╨╕╨╜╤ä╨╛╤Ç╨╝╨░╤å╨╕╤Ä ╨╛╨▒ ╤â╤ü╨┐╨╡╤ê╨╜╨╛╤ü╤é╨╕ ╨┐╨╛╨╗╤â╤ç╨╡╨╜╨╕╤Å ╨┤╨░╨╜╨╜╤ï╤à.
  7. Dim intRetValValue As Integer        '╨ƒ╨╛╤ü╨╗╨╡╨┤╨╜╨╡╨╡ ╨╖╨╜╨░╤ç╨╡╨╜╨╕╨╡, ╨║╨╛╤é╨╛╤Ç╨╛╨╡ ╨▓╨╛╨╖╨▓╤Ç╨░╤ë╨░╨╡╤é ╤ä╤â╨╜╨║╤å╨╕╤Å, ╨╕╨╖╨▓╨╗╨╡╨║╨░╤Ä╤ë╨░╤Å ╤ü╨╛╨┤╨╡╤Ç╨╢╨╕╨╝╨╛╨╡ ╤é╤ì╨│╨░. ╨í╨╛╨┤╨╡╤Ç╨╢╨╕╤é ╨╕╨╜╤ä╨╛╤Ç╨╝╨░╤å╨╕╤Ä ╨╛╨▒ ╤â╤ü╨┐╨╡╤ê╨╜╨╛╤ü╤é╨╕ ╨┐╨╛╨╗╤â╤ç╨╡╨╜╨╕╤Å ╨┤╨░╨╜╨╜╤ï╤à.
  8. Dim strTag As String            '╨ƒ╨╛╨╗╨╜╨░╤Å ╤ü╤é╤Ç╨╛╨║╨░ ╤é╤ì╨│╨░, ╨╖╨░╨║╨╗╤Ä╤ç╨╡╨╜╨╜╨░╤Å ╨╝╨╡╨╢╨┤╤â ╤ü╨║╨╛╨▒╨║╨░╨╝╨╕ "<" ╨╕ ">"
  9. Dim strTagName As String        '╨ÿ╨╝╤Å ╤é╤ì╨│╨░, ╨┐╨╛╨╗╤â╤ç╨░╤Ä╤ë╨╡╨╡╤ü╤Å ╨╕╨╖ ╤ü╤é╤Ç╨╛╨║╨╕ strTag ╨┐╨╛╤ü╨╗╨╡ ╨╛╤é╨▒╤Ç╨░╤ü╤ï╨▓╨░╨╜╨╕╤Å ╨░╤é╤é╤Ç╨╕╨▒╤â╤é╨╛╨▓ ╤é╤ì╨│╨░
  10. Dim strTagValue As String        '╨ù╨╜╨░╤ç╨╡╨╜╨╕╨╡ ╤é╤ì╨│╨░.
  11.  
  12. Dim iDepthLevel As Integer        '╨ú╤Ç╨╛╨▓╨╡╨╜╤î ╨▓╨╗╨╛╨╢╨╡╨╜╨╜╨╛╤ü╤é╨╕ ╨┤╨░╨╜╨╜╤ï╤à ╤ü╨╛╤é╤Ç╤â╨┤╨╜╨╕╨║╨░ ╨▓ XML-╤ä╨░╨╣╨╗╨╡. ╨₧╨┐╤Ç╨╡╨┤╨╡╨╗╤Å╨╡╤é╤ü╤Å ╨║╨╛╨╗╨╕╤ç╨╡╤ü╤é╨▓╨╛╨╝ ╨╜╨░╤ç╨░╨╗╤î╤ü╤é╨▓╨░ ╤â ╤ü╨╛╤é╤Ç╤â╨┤╨╜╨╕╨║╨░.
  13. Dim iIDCounter As Integer        '╨ÿ╨╜╨┤╨╡╨║╤ü ╨┤╨░╨╜╨╜╨╛╨│╨╛ ╤ü╨╛╤é╤Ç╤â╨┤╨╜╨╕╨║╨░.
  14. Dim iChiefIndex As Integer        '╨ÿ╨╜╨┤╨╡╨║╤ü ╨╜╨╡╨┐╨╛╤ü╤Ç╨╡╨┤╤ü╤é╨▓╨╡╨╜╨╜╨╛╨│╨╛ ╨╜╨░╤ç╨░╨╗╤î╨╜╨╕╨║╨░ ╨┤╨░╨╜╨╜╨╛╨│╨╛ ╤ü╨╛╤é╤Ç╤â╨┤╨╜╨╕╨║╨░. 
  15. Dim aiChiefStack() As Integer        '╨í╤é╤ì╨║, ╨▓ ╨║╨╛╤é╨╛╤Ç╤ï╨╣ ╨╖╨░╨╜╨╛╤ü╤Å╤é╤ü╤Å ╨╕╨╜╨┤╨╡╨║╤ü╤ï ╨▓╤ü╨╡╤à ╤Ç╤â╨║╨╛╨▓╨╛╨┤╨╕╤é╨╡╨╗╨╡╨╣ ╤é╨╡╨║╤â╤ë╨╡╨│╨╛ ╤ü╨╛╤é╤Ç╤â╨┤╨╜╨╕╨║╨░ ╨▓ ╤ü╨╛╨╛╤é╨▓╨╡╤é╤ü╤é╨▓╨╕╨╕ ╤ü╨╛ ╨▓╨╗╨╛╨╢╨╡╨╜╨╜╨╛╤ü╤é╤î╤Ä ╨┤╨░╨╜╨╜╤ï╤à ╨▓ XML-╤ä╨░╨╣╨╗╨╡.
  16. Dim iChiefStackUBound  As Integer    '╨Æ╨╡╤Ç╤à╨╜╤Å╤Å ╨│╤Ç╨░╨╜╨╕╤å╨░ ╨╝╨░╤ü╤ü╨╕╨▓╨░ iChiefStackUBound  
  17.  
  18. Dim i As Integer
  19. Dim j As Integer
  20.  
  21. strOrgName = ""
  22. ReDim aiChiefStack(0) As Integer
  23. aiChiefStack(0) = 0
  24. iChiefStackUBound = 0
  25. iUBound = 0
  26. iUBound2= 0
  27. RedimArrays(0, 0)
  28.  
  29. '╨₧╤é╨║╤Ç╤ï╤é╨╕╨╡ XML-╤ä╨░╨╣╨╗╨░ ╨┤╨╗╤Å ╤ç╤é╨╡╨╜╨╕╤Å ╨┤╨░╨╜╨╜╤ï╤à
  30. intFileNumber = FreeFile()
  31. Open strXMLFileName For Input As #intFileNumber
  32.  
  33. intRetTagValue = 1
  34. intRetValValue = 1
  35. iDepthLevel = 1
  36. iIDCounter = 0
  37. '╨ƒ╨╛╨╗╤â╤ç╨╡╨╜╨╕╨╡ ╨╕ ╨╛╨▒╤Ç╨░╨▒╨╛╤é╨║╨░ ╨┤╨░╨╜╨╜╤ï╤à ╤ä╨░╨╣╨╗╨░ ╨┤╨╛ ╤é╨╡╤à ╨┐╨╛╤Ç, ╨┐╨╛╨║╨░ ╨╜╨╡ ╨▒╤â╨┤╨╡╤é ╨┤╨╛╤ü╤é╨╕╨│╨╜╤â╤é ╨║╨╛╨╜╨╡╤å ╤ä╨░╨╣╨╗╨░ ╨╕╨╗╨╕
  38. '╨╜╨╡ ╨▓╨╛╨╖╨╜╨╕╨║╨╜╨╡╤é ╨╛╤ê╨╕╨▒╨║╨░.
  39. Do While 1 = intRetTagValue And 1 = intRetValValue
  40.     '╨ù╨░╨│╤Ç╤â╨╖╨╕╤é╤î ╨▓ ╤ü╤é╤Ç╨╛╨║╨╛╨▓╤â╤Ä ╨┐╨╡╤Ç╨╡╨╝╨╡╨╜╨╜╤â╤Ä strTag ╤ü╨╗╨╡╨┤╤â╤Ä╤ë╨╕╨╣ ╤é╤ì╨│.
  41.     intRetTagValue = GetXMLTag(strTag, intFileNumber)
  42.     '╨ò╤ü╨╗╨╕ ╤é╤ì╨│ ╨╖╨░╤ç╨╕╤é╨░╨╜...
  43.     If intRetTagValue = 1 Then
  44.         '...╤é╨╛ ╨╛╤é╤ü╨╡╨║╨░╤Ä╤é╤ü╤Å ╨╗╨╕╤ê╨╜╨╕╨╡ ╨┐╤Ç╨╛╨▒╨╡╨╗╤ï...
  45.         strTag = Trim$(strTag)
  46.         '...╨╕ ╨╖╨░╨╝╨╡╨╜╤Å╤Ä╤é╤ü╤Å ╤ü╨╕╨╝╨▓╨╛╨╗╤ï ╨▓╨╛╨╖╨▓╤Ç╨░╤é╨░ ╨║╨░╤Ç╨╡╤é╨║╨╕ ╨╕ ╨┐╨╡╤Ç╨╡╨▓╨╛╨┤╨░ ╤ü╤é╤Ç╨╛╨║╨╕.
  47.         ReplaceChr10And13(strTag)
  48.         '╨ƒ╨╛╨╗╤â╤ç╨╕╤é╤î ╨╕╨╝╤Å ╤é╤ì╨│╨░.
  49.         If InStr(strTag, " ") Then
  50.             strTagName = Left(strTag, InStr(strTag, " "))
  51.         Else
  52.             strTagName = strTag
  53.         End If
  54.         Select Case strTagName 
  55.         '╨₧╤é╨║╤Ç╤ï╨▓╨░╤Ä╤ë╨╕╨╣ ╤é╤ì╨│, ╨╛╨┐╨╕╤ü╤ï╨▓╨░╤Ä╤ë╨╕╨╣ ╨┤╨░╨╜╨╜╤ï╨╡ ╤ü╨╗╨╡╨┤╤â╤Ä╤ë╨╡╨│╨╛ ╤ü╨╛╤é╤Ç╤â╨┤╨╜╨╕╨║╨░
  56.         Case constrPersonTag
  57.             '╨ÿ╨╜╨║╤Ç╨╡╨╝╨╡╨╜╤é╨╕╤Ç╤â╨╡╨╝ ╤ü╤ç╨╡╤é╤ç╨╕╨║ ╨╕╨╜╨┤╨╡╨║╤ü╨╛╨▓ ╤ü╨╛╤é╤Ç╤â╨┤╨╜╨╕╨║╨╛╨▓.
  58.             iIDCounter = iIDCounter + 1
  59.             '╨₧╨┐╤Ç╨╡╨┤╨╡╨╗╤Å╨╡╨╝ ╨╕╨╜╨┤╨╡╨║╤ü ╤Ç╤â╨║╨╛╨▓╨╛╨┤╨╕╤é╨╡╨╗╤Å ╤ü╨╛╤é╤Ç╤â╨┤╨╜╨╕╨║╨░
  60.             If iDepthLevel = 1 Then
  61.                 iChiefIndex = 0
  62.             Else
  63.                 iChiefIndex = aiChiefStack(iDepthLevel - 1)
  64.             End If
  65.             '╨ú ╨╜╨░╤ç╨░╨╗╤î╨╜╨╕╨║╨░ ╨┤╨░╨╜╨╜╨╛╨│╨╛ ╤ü╨╛╤é╤Ç╤â╨┤╨╜╨╕╨║╨░ ╨┤╨╛╨▒╨░╨▓╨╗╤Å╨╡╨╝ ╤ü╤ü╤ï╨╗╨║╤â ╨╜╨░ ╨╜╨╛╨▓╨╛╨│╨╛ ╨┐╨╛╨┤╤ç╨╕╨╜╨╡╨╜╨╜╨╛╨│╨╛.
  66.                   asSubordinates(iChiefIndex, asSubordCount(iChiefIndex)) = iIDCounter 
  67.                   asSubordCount(iChiefIndex)=asSubordCount(iChiefIndex) + 1
  68.             '╨ú╨▓╨╡╨╗╨╕╤ç╨╕╨▓╨░╨╡╨╝ ╤Ç╨░╨╖╨╝╨╡╤Ç╨╜╨╛╤ü╤é╨╕ ╨╝╨░╤ü╤ü╨╕╨▓╨╛╨▓ ╨┤╨╗╤Å ╨┐╨╛╨╝╨╡╤ë╨╡╨╜╨╕╤Å ╨▓ ╨╜╨╕╤à ╨┤╨░╨╜╨╜╤ï╤à ╨╜╨╛╨▓╨╛╨│╨╛ ╤ü╨╛╤é╤Ç╤â╨┤╨╜╨╕╨║╨░
  69.             If iUBound2<asSubordCount(iChiefIndex) Then
  70.                  RedimArrays(iUBound + 1, iUBound2 + 1)
  71.             Else
  72.                  RedimArrays(iUBound + 1, iUBound2)
  73.             End If
  74.             asID(iIDCounter) = CStr(iIDCounter)
  75.             If iDepthLevel = 1 Then
  76.                 asChiefID(iIDCounter) = ""
  77.             Else
  78.                 asChiefID(iIDCounter) = CStr(iChiefIndex)
  79.             End If
  80.         '╨₧╤é╨║╤Ç╤ï╨▓╨░╤Ä╤ë╨╕╨╣ ╤é╤ì╨│ ╤ü╨┐╨╕╤ü╨║╨░ ╨┐╨╛╨┤╤ç╨╕╨╜╨╡╨╜╨╜╤ï╤à ╤ü╨╛╤é╤Ç╤â╨┤╨╜╨╕╨║╨░.
  81.         Case constrSubordinatesTag
  82.             '╨ƒ╤Ç╨╕ ╨╜╨╡╨╛╨▒╤à╨╛╨┤╨╕╨╝╨╛╤ü╤é╨╕ ╤â╨▓╨╡╨╗╨╕╤ç╨╕╨▓╨░╨╡╨╝ ╤Ç╨░╨╖╨╝╨╡╤Ç ╤ü╤é╤ì╨║╨░ ╤Ç╤â╨║╨╛╨▓╨╛╨┤╨╕╤é╨╡╨╗╨╡╨╣ ╤ü╨╛╤é╤Ç╤â╨┤╨╜╨╕╨║╨╛╨▓
  83.             If iChiefStackUBound < iDepthLevel Then
  84.                 iChiefStackUBound = iDepthLevel 
  85.                 ReDim Preserve aiChiefStack(iChiefStackUBound) As Integer
  86.             End If
  87.             '╨ƒ╨╛╨╝╨╡╤ë╨░╨╡╨╝ ╨▓ ╤ü╤é╤ì╨║ ╨╕╨╜╨┤╨╡╨║╤ü ╤é╨╡╨║╤â╤ë╨╡╨│╨╛ ╤ü╨╛╤é╤Ç╤â╨┤╨╜╨╕╨║╨░ ╨╕ ╤â╨▓╨╡╨╗╨╕╤ç╨╕╨▓╨░╨╡╨╝ ╤ü╤ç╨╡╤é╤ç╨╕╨║ ╤â╤Ç╨╛╨▓╨╜╨╡╨╣ ╨▓╨╗╨╛╨╢╨╡╨╜╨╜╨╛╤ü╤é╨╕
  88.             aiChiefStack(iDepthLevel) = iIDCounter
  89.             iDepthLevel = iDepthLevel + 1
  90.         '╨ù╨░╨║╤Ç╤ï╨▓╨░╤Ä╤ë╨╕╨╣ ╤é╤ì╨│ ╤ü╨┐╨╕╤ü╨║╨░ ╨┐╨╛╨┤╤ç╨╕╨╜╨╡╨╜╨╜╤ï╤à ╤ü╨╛╤é╤Ç╤â╨┤╨╜╨╕╨║╨░.
  91.         Case "/" & constrSubordinatesTag
  92.             iDepthLevel = iDepthLevel - 1
  93.         '╨₧╤é╨║╤Ç╤ï╨▓╨░╤Ä╤ë╨╕╨╣ ╤é╤ì╨│ ╨╕╨╝╨╡╨╜╨╕ ╤ü╨╛╤é╤Ç╤â╨┤╨╜╨╕╨║╨░.
  94.         Case constrNameTag
  95.             '╨ù╨░╤ç╨╕╤é╨░╤é╤î ╨╖╨╜╨░╤ç╨╡╨╜╨╕╨╡ ╨╕╨╝╨╡╨╜╨╕ ╤ü╨╛╤é╤Ç╤â╨┤╨╜╨╕╨║╨░ 
  96.             intRetValValue = GetXMLTextValue(strTagValue, intFileNumber)
  97.             '╨ò╤ü╨╗╨╕ ╤é╤ì╨│ ╨╖╨░╤ç╨╕╤é╨░╨╜ ╨▒╨╡╨╖ ╨╛╤ê╨╕╨▒╨╛╨║, ╨┐╨╛╨╝╨╡╤ü╤é╨╕╤é╤î ╨┤╨░╨╜╨╜╤ï╨╡ ╨▓ ╨╝╨░╤ü╤ü╨╕╨▓.
  98.             If intRetValValue = 1 Then
  99.                 asName(iUBound) = strTagValue
  100.             End If
  101.         '╨₧╤é╨║╤Ç╤ï╨▓╨░╤Ä╤ë╨╕╨╣ ╤é╤ì╨│ ╨┤╨╛╨╗╨╢╨╜╨╛╤ü╤é╨╕ ╤ü╨╛╤é╤Ç╤â╨┤╨╜╨╕╨║╨░.
  102.         Case constrPostTag 
  103.             intRetValValue = GetXMLTextValue(strTagValue, intFileNumber)
  104.             If intRetValValue = 1 Then
  105.                 asPost(iUBound) = strTagValue
  106.             End If
  107.         '╨₧╤é╨║╤Ç╤ï╨▓╨░╤Ä╤ë╨╕╨╣ ╤é╤ì╨│ email ╤ü╨╛╤é╤Ç╤â╨┤╨╜╨╕╨║╨░.
  108.         Case constrEMailTag 
  109.             intRetValValue = GetXMLTextValue(strTagValue, intFileNumber)
  110.             If intRetValValue = 1 Then
  111.                 asEMail(iUBound) = strTagValue
  112.             End If
  113.         '╨₧╤é╨║╤Ç╤ï╨▓╨░╤Ä╤ë╨╕╨╣ ╤é╤ì╨│ ╨╜╨░╨╖╨▓╨░╨╜╨╕╤Å ╨║╨╛╨╝╨┐╨░╨╜╨╕╨╕.
  114.         Case constrCompanyNameTag 
  115.             intRetValValue = GetXMLTextValue(strTagValue, intFileNumber)
  116.             If intRetValValue = 1 Then
  117.                 strOrgName = strTagValue
  118.             End If
  119.         End Select
  120.     End If
  121. Loop
  122.  
  123. Close #intFileNumber
  124.  
  125. '╨ƒ╤Ç╨╛╨▓╨╡╤Ç╨╕╤é╤î ╨┐╤Ç╨╕╤ç╨╕╨╜╤â ╨╖╨░╨▓╨╡╤Ç╤ê╨╡╨╜╨╕╤Å ╨╖╨░╤ç╨╕╤é╤ï╨▓╨░╨╜╨╕╤Å ╤ä╨░╨╣╨╗╨░ - ╨▓╨╛╨╖╨╜╨╕╨║╨╜╨╛╨▓╨╡╨╜╨╕╨╡ ╨╛╤ê╨╕╨▒╨║╨╕ ╨╕╨╗╨╕ ╨┤╨╛╤ü╤é╨╕╨╢╨╡╨╜╨╕╨╡ ╨║╨╛╨╜╤å╨░ ╤ä╨░╨╣╨╗╨░.
  126. If -1 = intRetTagValue Or -1 = intRetValValue Then
  127.     MsgBox("Sintaksicheskaja oshibka v zachitivaemom XML-faile")
  128.     BuildOrgTreeFromXML = False
  129.     Exit Function
  130. End If
  131.  
  132. BuildOrgTreeFromXML = True
  133. Exit Function
  134.  
  135. ErrHandle:
  136.     MsgBox ("In performing the macros, an error has occured.", cdbExclamation)
  137.     BuildOrgTreeFromXML = False
  138.     Exit Function
  139. End Function
  140.  
  141. '========================================================================================================================
  142. '========================================================================================================================
  143.  
  144. '╨ú╨▓╨╡╨╗╨╕╤ç╨╕╨▓╨░╨╡╨╝ ╤Ç╨░╨╖╨╝╨╡╤Ç╨╜╨╛╤ü╤é╨╕ ╨╝╨░╤ü╤ü╨╕╨▓╨╛╨▓ ╨┤╨╗╤Å ╨┐╨╛╨╝╨╡╤ë╨╡╨╜╨╕╤Å ╨▓ ╨╜╨╕╤à ╨┤╨░╨╜╨╜╤ï╤à ╨╜╨╛╨▓╨╛╨│╨╛ ╤Ç╨╡╤ü╤â╤Ç╤ü╨░
  145. Sub RedimArrays(ByVal intUBound As Integer, ByVal intUBound2 As Integer)
  146.     
  147.     Dim aiTempAtt() As Integer
  148.     Dim i As Integer
  149.     Dim j As Integer
  150.     Dim iOldUBound As Integer
  151.     Dim iOldUBound2 As Integer
  152.     
  153. '╨ƒ╨╛╤ü╨║╨╛╨╗╤î╨║╤â ╨┐╤Ç╨╕ Redim Preserve ╨▓╨╛╨╖╨╝╨╛╨╢╨╜╨╛ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╨╡ ╤é╨╛╨╗╤î╨║╨╛ ╨┐╨╛╤ü╨╗╨╡╨┤╨╜╨╡╨╣ ╤Ç╨░╨╖╨╝╨╡╤Ç╨╜╨╛╤ü╤é╨╕ ╨╝╨░╤ü╤ü╨╕╨▓╨░,
  154. '╤ü╨╛╤à╤Ç╨░╨╜╤Å╨╡╨╝ ╨┤╨░╨╜╨╜╤ï╨╡ ╨┤╨▓╤â╨╝╨╡╤Ç╨╜╨╛╨│╨╛ ╨╝╨░╤ü╤ü╨╕╨▓╨░ ╨▓╨╛ ╨▓╤Ç╨╡╨╝╨╡╨╜╨╜╨╛╨╝ ╤à╤Ç╨░╨╜╨╕╨╗╨╕╤ë╨╡.
  155.     iOldUBound = iUBound
  156.     iOldUBound2 = iUBound2
  157.     ReDim aiTempAtt(iOldUBound, iOldUBound2) As Integer
  158.     For i=0 To iOldUBound 
  159.         For j=0 To iOldUBound2 
  160.             aiTempAtt(i,j)=asSubordinates(i,j) 
  161.         Next
  162.     Next
  163.     
  164.     iUBound = intUBound 
  165.     iUBound2 = intUBound2 
  166.      ReDim Preserve asID(intUBound) As String
  167.      ReDim Preserve asChiefID(intUBound) As String
  168.      ReDim Preserve asName(intUBound) As String
  169.      ReDim Preserve asPost(intUBound) As String
  170.      ReDim Preserve asEMail(intUBound) As String
  171.      ReDim Preserve aiLevel(intUBound) As Integer
  172.      ReDim Preserve adBranchWidth(intUBound) As Double
  173.      ReDim Preserve adBranchHeight(intUBound) As Double
  174.      ReDim Preserve abNewPage(intUBound) As Boolean
  175.      ReDim Preserve asSubordCount(intUBound) As Integer
  176.      ReDim asSubordinates(intUBound,intUBound2) As Integer
  177.      
  178.      asID(intUBound)=""
  179.      asChiefID(intUBound)=""
  180.      asName(intUBound)=""
  181.      asPost(intUBound)=""
  182.      asEMail(intUBound)=""
  183.      aiLevel(intUBound)=0
  184.      adBranchWidth(intUBound)=0
  185.      adBranchHeight(intUBound)=0
  186.      abNewPage(intUBound)=False
  187.      asSubordCount(intUBound)=0
  188.  
  189.     For i=0 To iOldUBound 
  190.         For j=0 To iOldUBound2 
  191.             asSubordinates(i,j)=aiTempAtt(i,j) 
  192.         Next
  193.     Next
  194.     
  195. End Sub
  196.  
  197. '========================================================================================================================
  198. '========================================================================================================================
  199.  
  200. '╨ù╨░╨╝╨╡╨╜╨░ entity ╨▓ ╤ü╤é╤Ç╨╛╨║╨╡, ╨┐╨╛╨╗╤â╤ç╨╡╨╜╨╜╨╛╨╣ ╨╕╨╖ XML-╤ä╨░╨╣╨╗╨░ ╨╜╨░ ╨╛╨▒╨╛╨╖╨╜╨░╤ç╨░╨╡╨╝╤ï╨╣ ╨╡╤Ä ╤ü╨╕╨╝╨▓╨╛╨╗
  201. Function ReReplaceSymbols(ByRef strText As String) As String
  202.     Dim iFindPos As Integer
  203.     Dim strRepSymbols As String
  204.     
  205.     strRepSymbols = ">"
  206.     iFindPos = InStr(strText, strRepSymbols)
  207.     Do While iFindPos > 0
  208.         strText = Left(strText, iFindPos - 1) & ">" & Right(strText, Len(strText) - iFindPos - Len(strRepSymbols) + 1 )
  209.         iFindPos = InStr(iFindPos + 1, strText, strRepSymbols )
  210.     Loop
  211.  
  212.     strRepSymbols = "<"
  213.     iFindPos = InStr(strText, strRepSymbols)
  214.     Do While iFindPos > 0
  215.         strText = Left(strText, iFindPos - 1) & "<" & Right(strText, Len(strText) - iFindPos - Len(strRepSymbols) + 1 )
  216.         iFindPos = InStr(iFindPos + 1, strText, strRepSymbols )
  217.     Loop
  218.  
  219.     strRepSymbols = "'"
  220.     iFindPos = InStr(strText, strRepSymbols)
  221.     Do While iFindPos > 0
  222.         strText = Left(strText, iFindPos - 1) & "'" & Right(strText, Len(strText) - iFindPos - Len(strRepSymbols) + 1 )
  223.         iFindPos = InStr(iFindPos + 1, strText, strRepSymbols )
  224.     Loop
  225.  
  226.     strRepSymbols = """
  227.     iFindPos = InStr(strText, strRepSymbols)
  228.     Do While iFindPos > 0
  229.         strText = Left(strText, iFindPos - 1) & """" & Right(strText, Len(strText) - iFindPos - Len(strRepSymbols) + 1 )
  230.         iFindPos = InStr(iFindPos + 1, strText, strRepSymbols )
  231.     Loop
  232.  
  233.     strRepSymbols = "&"
  234.     iFindPos = InStr(strText, strRepSymbols)
  235.     Do While iFindPos > 0
  236.         strText = Left(strText, iFindPos - 1) & "&" & Right(strText, Len(strText) - iFindPos - Len(strRepSymbols) + 1 )
  237.         iFindPos = InStr(iFindPos + 1, strText, strRepSymbols )
  238.     Loop
  239.     
  240.     ReReplaceSymbols = strText
  241.     
  242. End Function 
  243.  
  244. '========================================================================================================================
  245. '========================================================================================================================
  246.  
  247. '╨ù╨░╨╝╨╡╨╜╨╕╤é╤î ╨▓ ╤ü╤é╤Ç╨╛╨║╨╡ ╤ü╨╕╨╝╨▓╨╛╨╗╤ï ╨┐╨╡╤Ç╨╡╨▓╨╛╨┤╨░ ╤ü╤é╤Ç╨╛╨║╨╕ ╨╕ ╨▓╨╛╨╖╨▓╤Ç╨░╤é╨░ ╨║╨░╤Ç╨╡╤é╨║╨╕ ╨╜╨░ ╨┐╤Ç╨╛╨▒╨╡╨╗╤ï
  248. Sub ReplaceChr10And13(ByRef strText As String)
  249.     Dim iFindPos As Integer
  250.     
  251.     iFindPos = InStr(strText, Chr(10))
  252.     Do While iFindPos > 0
  253.         strText = Left(strText, iFindPos - 1) & " " & Right(strText, Len(strText) - iFindPos)
  254.         iFindPos = InStr(iFindPos + 1, strText, Chr(10))
  255.     Loop
  256.  
  257.     iFindPos = InStr(strText, Chr(13))
  258.     Do While iFindPos > 0
  259.         strText = Left(strText, iFindPos - 1) & " " & Right(strText, Len(strText) - iFindPos)
  260.         iFindPos = InStr(iFindPos + 1, strText, Chr(13))
  261.     Loop
  262. End Sub 
  263.  
  264. '========================================================================================================================
  265. '========================================================================================================================
  266.  
  267. '╨ƒ╨╛╨╗╤â╤ç╨░╨╡╨╝ ╨╖╨╜╨░╤ç╨╡╨╜╨╕╨╡ XML-╤é╤ì╨│╨░. ╨ƒ╤Ç╨╕ ╤ì╤é╨╛╨╝ ╤ü╤ç╨╕╤é╨░╨╡╨╝. ╤ç╤é╨╛ ╨▓╨╜╤â╤é╤Ç╨╕ ╨┤╨░╨╜╨╜╨╛╨│╨╛ ╤é╤ì╨│╨░ ╨╜╨╡ ╨╝╨╛╨│╤â╤é ╨╜╨░╤à╨╛╨┤╨╕╤é╤î╤ü╤Å
  268. '╨┤╤Ç╤â╨│╨╕╨╡ ╤é╤ì╨│╨╕, ╨▓ ╤é╨╛╨╝ ╤ç╨╕╤ü╨╗╨╡ ╨║╨╛╨╝╨╝╨╡╨╜╤é╨░╤Ç╨╕╤Å.
  269. Function GetXMLTextValue(ByRef strTagValue As String, ByVal intFileNumber As Integer) As Integer
  270.     Dim intOldLen As Integer
  271.     Dim bReadNextPart As Boolean 
  272.     Dim iNextTagPos As Integer
  273.  
  274.     intOldLen = 0
  275.     
  276.     strTagValue = strBuffer 
  277.     bReadNextPart=True
  278.  
  279.     Do
  280.         '╨¥╨░╨╣╤é╨╕ ╨╜╨░╤ç╨░╨╗╨╛ ╨╖╨░╨║╤Ç╤ï╨▓╨░╤Ä╤ë╨╡╨│╨╛ ╤é╤ì╨│╨░
  281.         iNextTagPos=InStr(strTagValue , "<")
  282.         
  283.         If iNextTagPos>0 Then
  284.             '╨ò╤ü╨╗╨╕ ╤é╤ì╨│ ╨╜╨░╨╣╨┤╨╡╨╜, ╨╝╨╛╨╢╨╜╨╛ ╨▓╤ï╨╣╤é╨╕ ╨╕╨╖ ╤å╨╕╨║╨╗╨░ ╨╕ ╨▓╨╡╤Ç╨╜╤â╤é╤î ╨╖╨╜╨░╤ç╨╡╨╜╨╕╨╡
  285.             bReadNextPart=False
  286.         Else
  287.             '╨ò╤ü╨╗╨╕ ╨╖╨░╨║╤Ç╤ï╨▓╨░╤Ä╤ë╨╕╨╣ ╤é╤ì╨│ ╨╜╨╡ ╨╜╨░╨╣╨┤╨╡╨╜ ╨╕ ╨┤╨╛╤ü╤é╨╕╨│╨╜╤â╤é ╨║╨╛╨╜╨╡╤å ╤ä╨░╨╣╨╗╨░, ╤ä╤â╨╜╨║╤å╨╕╤Å ╨▓╨╛╨╖╨▓╤Ç╨░╤ë╨░╨╡╤é ╨╛╤ê╨╕╨▒╨║╤â.
  288.             If EOF(intFileNumber) Then
  289.                 GetXMLTextValue = -1
  290.                 Exit Function
  291.             End If
  292.         End If
  293.         
  294.         '╨ò╤ü╨╗╨╕ ╤é╤ì╨│ ╨╜╨╡ ╨╜╨░╨╣╨┤╨╡╨╜ ╨╕ ╨║╨╛╨╜╨╡╤å ╤ä╨░╨╣╨╗╨░ ╨╡╤ë╨╡ ╨╜╨╡ ╨┤╨╛╤ü╤é╨╕╨│╨╜╤â╤é, ╨╖╨░╤ç╨╕╤é╨░╤é╤î ╨╕╨╖ ╤ä╨░╨╣╨╗╨░ ╨▓ ╨▒╤â╤ä╨╡╤Ç ╤ü╨╗╨╡╨┤╤â╤Ä╤ë╤â╤Ä ╨┐╨╛╤Ç╤å╨╕╤Ä ╤ü╨╕╨╝╨▓╨╛╨╗╨╛╨▓.                
  295.         If bReadNextPart Then
  296.             strBuffer = Input$(conintInputSymbCount, intFileNumber)
  297.             intOldLen = Len(strTagValue )
  298.             strTagValue = strTagValue + strBuffer
  299.         End If
  300.     Loop While bReadNextPart
  301.     
  302.     '╨ƒ╨╛╨╗╤â╤ç╨╕╤é╤î ╨╖╨╜╨░╤ç╨╡╨╜╨╕╨╡ ╤é╤ì╨│╨░
  303.     strTagValue = Left(strTagValue, iNextTagPos-1)
  304.     '╨ù╨░╨╝╨╡╨╜╨╕╤é╤î ╤ü╨╕╨╝╨▓╨╛╨╗╤ï ╨▓╨╛╨╖╨▓╤Ç╨░╤é╨░ ╨║╨░╤Ç╨╡╤é╨║╨╕ ╨╕ ╨┐╨╡╤Ç╨╡╨▓╨╛╨┤╨░ ╤ü╤é╤Ç╨╛╨║╨╕ ╨╜╨░ ╨┐╤Ç╨╛╨▒╨╡╨╗╤ï
  305.     ReplaceChr10And13(strTagValue) 
  306.     Trim$(strTagValue)
  307.     '╨ù╨░╨╝╨╡╨╜╨╕╤é╤î entity ╨╜╨░ ╤ü╨╕╨╝╨▓╨╛╨╗╤ï, ╨║╨╛╤é╨╛╤Ç╤ï╨╡ ╨╛╨╜╨╕ ╨┐╤Ç╨╡╨┤╤ü╤é╨░╨▓╨╗╤Å╤Ä╤é
  308.     strTagValue = ReReplaceSymbols(strTagValue)
  309.     '╨ú╨┤╨░╨╗╨╕╤é╤î ╨╕╨╖ ╨▒╤â╤ä╨╡╤Ç╨░ ╤â╨╢╨╡ ╨╛╨▒╤Ç╨░╨▒╨╛╤é╨░╨╜╨╜╤â╤Ä ╤ç╨░╤ü╤é╤î
  310.     strBuffer = Mid(strBuffer, iNextTagPos-intOldLen)
  311.     GetXMLTextValue = 1
  312. End Function
  313.  
  314. '========================================================================================================================
  315. '========================================================================================================================
  316.  
  317. '╨ù╨░╨│╤Ç╤â╨╖╨╕╤é╤î ╨▓ ╤ü╤é╤Ç╨╛╨║╨╛╨▓╤â╤Ä ╨┐╨╡╤Ç╨╡╨╝╨╡╨╜╨╜╤â╤Ä strTag ╤ü╨╗╨╡╨┤╤â╤Ä╤ë╨╕╨╣ ╤é╤ì╨│.
  318. Function GetXMLTag(ByRef strTag As String, ByVal intFileNumber As Integer) As Integer
  319.     Dim intOldLen As Integer
  320.     Dim iLt As Integer    '╨ƒ╨╛╨╗╨╛╨╢╨╡╨╜╨╕╨╡ ╨┐╨╡╤Ç╨▓╨╛╨╣ ╤ü╨║╨╛╨▒╨║╨╕ '<'
  321.     Dim iGt As Integer    '╨ƒ╨╛╨╗╨╛╨╢╨╡╨╜╨╕╨╡ ╨┐╨╡╤Ç╨▓╨╛╨╣ ╤ü╨║╨╛╨▒╨║╨╕ '>'
  322.     Dim iLt2 As Integer    '╨ƒ╨╛╨╗╨╛╨╢╨╡╨╜╨╕╨╡ ╨▓╤é╨╛╤Ç╨╛╨╣ ╤ü╨║╨╛╨▒╨║╨╕ '<'
  323.     Dim bReadNextPart As Boolean
  324.     
  325.     intOldLen = 0
  326.     
  327.     strTag = strBuffer 
  328.     bReadNextPart=True
  329.     Do
  330.         iLt=Instr(strTag, "<")
  331.         iGt=Instr(strTag, ">")
  332.         '╨Æ ╤ü╤é╤Ç╨╛╨║╨╡ ╨╡╤ü╤é╤î ╨╕ ╨╛╤é╨║╤Ç╤ï╨▓╨░╤Ä╤ë╨░╤Å, ╨╕ ╨╖╨░╨║╤Ç╤ï╨▓╨░╤Ä╤ë╨░╤Å ╤â╨│╨╗╨╛╨▓╤ï╨╡ ╤ü╨║╨╛╨▒╨║╨╕
  333.         If iLt > 0 And iGt > 0 Then
  334.             '╨¥╨░╤ç╨╡╤Ç╨╜╨╛ ╨┐╤Ç╨╛╨▓╨╡╤Ç╨╕╤é╤î ╨║╨╛╤Ç╤Ç╨╡╨║╤é╨╜╨╛╤ü╤é╤î ╤Ç╨░╤ü╤ü╤é╨░╨╜╨╛╨▓╨║╨╕ ╤â╨│╨╗╨╛╨▓╤ï╤à ╤ü╨║╨╛╨▒╨╛╨║
  335.             If iLt < iGt Then '╨í╨┐╨╡╤Ç╨▓╨░ ╤ü╤é╨╛╨╕╤é ╨╛╤é╨║╤Ç╤ï╨▓╨░╤Ä╤ë╨░╤Å, ╨╖╨░╤é╨╡╨╝ ╨╖╨░╨║╤Ç╤ï╨▓╨░╤Ä╤ë╨░╤Å ╤ü╨║╨╛╨▒╨║╨╕
  336.                 '╨ƒ╤Ç╨╛╨▓╨╡╤Ç╤Å╨╡╨╝ ╨┤╨░╨╗╤î╤ê╨╡
  337.                 If iLt=Instr(strTag, "<!--") Then '╨¥╨░╤é╨║╨╜╤â╨╗╨╕╤ü╤î ╨╜╨░ ╨╛╤é╨║╤Ç╤ï╨▓╨░╤Ä╤ë╤â╤Ä ╤ü╨║╨╛╨▒╨║╤â ╨║╨╛╨╝╨╝╨╡╨╜╤é╨░╤Ç╨╕╤Å
  338.                     iGt=Instr(strTag, "-->")+2 '╨ÿ╤ë╨╡╨╝ ╨╖╨░╨║╤Ç╤ï╨▓╨░╤Ä╤ë╤â╤Ä ╤ü╨║╨╛╨▒╨║╤â ╨║╨╛╨╝╨╝╨╡╨╜╤é╨░╤Ç╨╕╤Å. iGT, ╨▓╨╛╨╖╨╝╨╛╨╢╨╜╨╛, ╨┐╨╛╨╗╤â╤ç╨░╨╡╤é ╨╜╨╛╨▓╨╛╨╡ ╨╖╨╜╨░╤ç╨╡╨╜╨╕╨╡
  339.                     If iGt - 2 > 0 Then
  340.                         bReadNextPart = False '╨₧! ╨¡╤é╨╛ ╤â╨╢╨╡ ╨▓╨╡╤ü╤î ╨║╨╛╨╝╨╝╨╡╨╜╤é╨░╤Ç╨╕╨╣!
  341.                     End If
  342.                 Else  '╨¡╤é╨╛-╤é╨░╨║╨╕ ╨╜╨╡ ╨║╨╛╨╝╨╝╨╡╨╜╤é╨░╤Ç╨╕╨╣
  343.                     iLt2=Instr(iLt+1, strTag, "<") 
  344.                     If iLt2>0 And iLt2<iGt Then
  345.                         GetXMLTag=-1 '╨Ü╤é╨╛-╤é╨╛ ╨╜╨░╤à╨╕╨╝╨╕╤ç╨╕╨╗ ╤ü╨╛ ╤ü╨║╨╛╨▒╨║╨░╨╝╨╕ "...<...<...>..."
  346.                         Exit Function
  347.                     Else
  348.                         bReadNextPart = False
  349.                     End If
  350.                 End If
  351.             Else
  352.                 GetXMLTag=-1 '╨Ü╨░╤Ç╨░╤â╨╗! ╨í╨║╨╛╨▒╨║╨╕ ╤Ç╨░╤ü╤ü╤é╨░╨▓╨╗╨╡╨╜╤ï ╤é╨░╨║, ╤ç╤é╨╛ ╤ü╨░╨╝ ╤ç╨╡╤Ç╤é ╨╜╨╛╨│╤â ╤ü╨╗╨╛╨╝╨╕╤é! "...>...<..."
  353.                 Exit Function
  354.             End If
  355.         End If
  356.         
  357.         If bReadNextPart Then
  358.             If EOF(intFileNumber) Then
  359.                 If iLt = 0 And iGt = 0 Then 
  360.                     GetXMLTag = 0 '╨ñ╨░╨╣╨╗ ╨╖╨░╤ç╨╕╤é╨░╨╜ ╨┐╨╛╨╗╨╜╨╛╤ü╤é╤î╤Ä: ╤é╤ì╨│╨╛╨▓ ╨▒╨╛╨╗╤î╤ê╨╡ ╨╜╨╡╤é.
  361.                 Else
  362.                     GetXMLTag = -1 '╨ñ╨░╨╣╨╗ ╨╖╨░╤ç╨╕╤é╨░╨╜ ╨┐╨╛╨╗╨╜╨╛╤ü╤é╤î╤Ä, ╨╜╨╛ ╨╜╨╡ ╤à╨▓╨░╤é╨░╨╡╤é ╤ü╨║╨╛╨▒╨╛╨║. ╨Æ╨╛╨╖╨╜╨╕╨║╨╗╨░ ╨╛╤ê╨╕╨▒╨║╨░.
  363.                 End If
  364.                 Exit Function
  365.             Else 'if the end not found, reading a new data portion to the buffer
  366.                 strBuffer = Input$(conintInputSymbCount, intFileNumber)
  367.                 intOldLen = Len(strTag)
  368.                 strTag = strTag + strBuffer
  369.             End If
  370.         End If
  371.     Loop While bReadNextPart
  372.     
  373.     '╨ƒ╨╛╨╗╤â╤ç╨╕╤é╤î ╤é╤ì╨│
  374.     strTag = Mid(strTag, iLt+1, iGt-iLt-1)
  375.     '╨ú╨┤╨░╨╗╨╕╤é╤î ╨╕╨╖ ╨▒╤â╤ä╨╡╤Ç╨░ ╤â╨╢╨╡ ╨╛╨▒╤Ç╨░╨▒╨╛╤é╨░╨╜╨╜╤â╤Ä ╤ç╨░╤ü╤é╤î
  376.     strBuffer = Mid(strBuffer, iGt-intOldLen+1)
  377.     GetXMLTag = 1
  378. End Function
  379.  
  380.